home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / mail / pine3.96.tar.gz / pine3.96.tar / pine3.96 / pine / osdep / fltrname.os2 < prev    next >
Text File  |  1996-03-14  |  3KB  |  112 lines

  1. #line 2 "osdep/fltrname.os2"
  2. /*----------------------------------------------------------------------
  3.     Filter file names for strange characters
  4.  
  5.    Args:  file  -- the file name to check
  6.  
  7.  Result: Returns NULL if file name is OK
  8.          Returns formatted error message if it is not
  9.   ----*/
  10. char *
  11. filter_filename(file)
  12.     char *file;
  13. {
  14.     static char illegal[] = {'\177', '\0'};
  15.     static char error[100];
  16.     char ill_file[MAXPATH+1], *ill_char, *ptr, e2[10];
  17.  
  18.     ptr = file;
  19.     while (*ptr == ' ') ptr++;    /* leading spaces GONE! */
  20.  
  21.     if(*ptr == '*')
  22.       ptr++; /* Allow * at beginning for news groups */
  23.  
  24.     while(*ptr && *ptr > ' ' && strindex(illegal, *ptr) == 0)
  25.       ptr++;
  26.  
  27.     if(*ptr != '\0') {
  28.         if(*ptr == '\n') {
  29.             ill_char = "<newline>";
  30.         } else if(*ptr == '\r') {
  31.             ill_char = "<carriage return>";
  32.         } else if(*ptr == '\t') {
  33.             ill_char = "<tab>";
  34.         } else if(*ptr < ' ') {
  35.             sprintf(e2, "control-%c", *ptr + '@');
  36.             ill_char = e2;
  37.         } else if (*ptr == '\177') {
  38.             ill_char = "<del>";
  39.         } else {
  40.             e2[0] = *ptr;
  41.             e2[1] = '\0';
  42.             ill_char = e2;
  43.         }
  44.         if(ptr != file) {
  45.             strncpy(ill_file, file, ptr - file);
  46.             ill_file[ptr - file] = '\0';
  47.             sprintf(error,"Character \"%s\" after \"%s\" not allowed",ill_char,
  48.                     ill_file);
  49.         } else {
  50.             sprintf(error,
  51.                     "First character, \"%s\", not allowed",
  52.                     ill_char);
  53.         }
  54.             
  55.         return(error);
  56.     }
  57.     return(NULL);
  58. }
  59.  
  60.  
  61. /*----------------------------------------------------------------------
  62.     Check to see if user is allowed to read or write this folder.
  63.  
  64.    Args:  s  -- the name to check
  65.  
  66.  Result: Returns 1 if OK
  67.          Returns 0 and posts an error message if access is denied
  68.   ----*/
  69. int
  70. cntxt_allowed(s)
  71.     char *s;
  72. {
  73.     struct variable *vars = ps_global->vars;
  74.     int retval = 1;
  75.     MAILSTREAM stream; /* fake stream for error message in mm_notify */
  76.  
  77.     if(ps_global->restricted
  78.          && (strindex("./~", s[0]) || srchstr(s, "\\..\\"))){
  79.     stream.mailbox = s;
  80.     mm_notify(&stream, "Restricted mode doesn't allow operation", WARN);
  81.     retval = 0;
  82.     }
  83.     else if(VAR_OPER_DIR
  84.         && s[0] != '{' && !(s[0] == '*' && s[1] == '{')
  85.         && strucmp(s,ps_global->inbox_name) != 0
  86.         && strcmp(s, ps_global->VAR_INBOX_PATH) != 0){
  87.     char *p, *free_this = NULL;
  88.  
  89.     p = s;
  90.     /* add home dir to relative paths */
  91.     if(s[0] != '/'){
  92.         free_this = p = (char *)fs_get(strlen(s)
  93.                         + strlen(ps_global->home_dir) + 2);
  94.         build_path(p, ps_global->home_dir, s);
  95.     }
  96.     
  97.     if(!in_dir(VAR_OPER_DIR, p)){
  98.         char err[200];
  99.  
  100.         sprintf(err, "No operations allowed outside of %s", VAR_OPER_DIR);
  101.         stream.mailbox = p;
  102.         mm_notify(&stream, err, WARN);
  103.         retval = 0;
  104.     }
  105.  
  106.     if(free_this)
  107.       fs_give((void **)&free_this);
  108.     }
  109.     
  110.     return retval;
  111. }
  112.